package models

import (
	"fmt"
	"gorm.io/gorm"
	"time"
)

// ProjectTag 与数据库表 project_tag 绑定
type ProjectTag struct {
	ID         uint64    `gorm:"primaryKey;autoIncrement" json:"id" form:"id"`
	ProjectID  uint64    `gorm:"column:project_id;notNull" json:"project_id" form:"project_id"`
	GitURL     string    `gorm:"column:git_url;type:VARCHAR(255);notNull" json:"git_url" form:"git_url"`
	TagVersion string    `gorm:"column:tag_version;type:VARCHAR(50);notNull" json:"tag_version" form:"tag_version"`
	CreatedAt  time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at"`
}

// TableName 返回绑定的表名
func (ProjectTag) TableName() string {
	return "project_tag"
}

//	ExistsByGitURL
//
// 描述信息： 根据 git_url 判断表中是否有记录
//
// Param：
//
//	db ：数据库链接实例
//	gitURL ：GitHttpUrl
//
// Return：
//
//	bool ：存在true，不存在false
//	error ：错误信息
func (p ProjectTag) ExistsByGitURL(db *gorm.DB, gitURL string) (bool, error) {
	var count int64
	result := db.Model(&ProjectTag{}).Where("git_url = ?", gitURL).Count(&count)
	if result.Error != nil {
		return false, result.Error
	}
	return count > 0, nil
}

//	UpdateTagVersionByGitURL
//
// 描述信息：  根据 git_url 更新 tag_version
//
// Param：
//
//	db ：数据库链接实例
//	gitHttpURL ：GitHttpUrl
//	tagVersion ：版本信息
//
// Return：
//
//	error ：错误信息
func (p ProjectTag) UpdateTagVersionByGitURL(db *gorm.DB, gitHttpURL, tagVersion string) error {
	result := db.Model(&ProjectTag{}).Where("git_url = ?", gitHttpURL).Update("tag_version", tagVersion)
	if result.Error != nil {
		return result.Error
	}
	return nil
}

// GetTagVersionByGitURL 根据 git_url 查询 tag_version 的值
func (p ProjectTag) GetTagVersionByGitURL(db *gorm.DB, gitURL string) (string, error) {
	var tag ProjectTag
	result := db.Where("git_url = ?", gitURL).First(&tag)
	if result.Error != nil {
		return "", result.Error
	}
	return tag.TagVersion, nil
}

//	InsertProjectTag
//
// 描述信息： 插入新数据
//
// Param：
//
//	db ：数据库链接实例
//	projectID ：项目id
//	gitURL ：GitHttpUrl
//	tagVersion ：版本信息
//
// Return：
//
//	bool ：成功true，失败false
//	error ：错误信息
func (p ProjectTag) InsertProjectTag(db *gorm.DB, projectID uint64, gitURL, tagVersion string) (bool, error) {
	tag := ProjectTag{
		ProjectID:  projectID,
		GitURL:     gitURL,
		TagVersion: tagVersion,
		CreatedAt:  time.Now(),
	}
	result := db.Create(&tag)
	if result.Error != nil {
		return false, result.Error
	}
	return true, nil
}

//	UpdateProjectTag
//
// 描述信息： 更新tag_version
//
// Param：
//
//	db ：数据库链接实例
//	gitURL ：GitHttpUrl
//	tagVersion ：版本号
//
// Return：
//
//	bool ：成功true，失败false
//	error ：错误信息
func (p ProjectTag) UpdateProjectTag(db *gorm.DB, gitURL, tagVersion string) (bool, error) {
	// 获取当前的 tag_version
	currentTagVersion, err := ProjectTag{}.GetTagVersionByGitURL(db, gitURL)
	if err != nil {
		return false, err
	}

	// 检查 tag_version 是否一致
	if currentTagVersion == tagVersion {
		// 如果一致，什么都不做
		return false, nil
	}

	// 如果不一致，更新 tag_version
	err = ProjectTag{}.UpdateTagVersionByGitURL(db, gitURL, tagVersion)
	if err != nil {
		return false, err
	}
	return true, nil
}

// DeleteProjectTagsByProjectID 根据 project_id 删除所有相关的 ProjectTag 记录
func (p ProjectTag) DeleteProjectTagsByProjectID(db *gorm.DB, projectID uint64) error {
	result := db.Where("project_id = ?", projectID).Delete(&ProjectTag{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete project tags with project_id %d: %w", projectID, result.Error)
	}
	return nil
}
